Asociace souboru s MDI aplikaci

Otázka od: Jiri Foldyna

6. 10. 2004 11:33

Ahoj,

omlouvam se za asi neprilis vystizny subj, ale jde v podstate o toto:

Mam MDI aplikaci, ktera je asociovana z urcitym typem souboru. Po poklepani
na soubor napr. v pruzkumniku se spusti aplikace a otevre se okno se
souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
nespoustela dalsi instance, ale aby se v bezici aplikaci otevrelo dalsi
okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
predat bezici aplikaci nazev souboru. Jak to resite ?

Diky

Jiri Foldyna


Odpovedá: Ing. Petr Sikola

6. 10. 2004 12:15

ja to delam pres message wm_copydata
kde si v aplikaci (jeste v *.dpr) zjistim jestli je jiz spustena jina
instance, a pokud ano, posilam mesage do te drive spustene, pokud ne,
nic neposilam.

v te drive spustene si wm_copydata odchytnu a prectu si z ni jmena
souboru.

Petr Sikola

> souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
> nespoustela dalsi instance, ale aby se v bezici aplikaci
> otevrelo dalsi
> okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
> predat bezici aplikaci nazev souboru. Jak to resite ?
> Jiri Foldyna



Odpovedá: Jan Rizek

6. 10. 2004 12:36

Tohle jsem nikdy neresil, ale slo by ho zapsat do souboru a z nej si to
precist.. (ShellChangeNotifier) .


> Ahoj,
>
> omlouvam se za asi neprilis vystizny subj, ale jde v podstate o toto:
>
> Mam MDI aplikaci, ktera je asociovana z urcitym typem souboru. Po
poklepani
> na soubor napr. v pruzkumniku se spusti aplikace a otevre se okno se
> souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
> nespoustela dalsi instance, ale aby se v bezici aplikaci otevrelo dalsi
> okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
> predat bezici aplikaci nazev souboru. Jak to resite ?
>
> Diky
>
> Jiri Foldyna
>
>
>
>
>


Odpovedá: Ondrej Kelle

6. 10. 2004 12:17

> Mam MDI aplikaci, ktera je asociovana z urcitym typem
> souboru. Po poklepani na soubor napr. v pruzkumniku
> se spusti aplikace a otevre se okno se souborem.
> Potreboval bych ale, aby se v pripade, ze aplikace uz
> bezi, nespoustela dalsi instance, ale aby se v bezici
> aplikaci otevrelo dalsi okno. Zjistit, jestli uz
> aplikace bezi, neni problem. Co potrebuji, je predat
> bezici aplikaci nazev souboru. Jak to resite ?

program MyApp;

uses
  Forms,
  JclAppInst,
  ...;

const
  MyAppUniqueID = ...; // napriklad GUID

begin
  with JclAppInstances(MyAppUniqueID) do
    if CheckInstance(1) then
    begin
      Application.Initialize;
      Application.Title := ...;
      Application.CreateForm(TMyAppMainForm, MyAppMainForm);
      Application.Run;
    end
    else
    begin
      SwitchTo(0);
      SendCmdLineParams('TMyAppMainForm', 0);
    end;
end.

HTH
TOndrej


Odpovedá: Ondrej Kelle

6. 10. 2004 12:31

>> Mam MDI aplikaci, ktera je asociovana z urcitym typem
>> souboru. Po poklepani na soubor napr. v pruzkumniku
>> se spusti aplikace a otevre se okno se souborem.
>> Potreboval bych ale, aby se v pripade, ze aplikace uz
>> bezi, nespoustela dalsi instance, ale aby se v bezici
>> aplikaci otevrelo dalsi okno. Zjistit, jestli uz
>> aplikace bezi, neni problem. Co potrebuji, je predat
>> bezici aplikaci nazev souboru. Jak to resite ?

Ospravedlnujem sa, moj predosly prispevok nebol uplny.
Ten kod v .dpr posle prvej instancii spravu WM_COPYDATA, takze v hlavnom
formulari aplikacie treba tuto spravu osetrit:

procedure TMyAppMainForm.WMCopyData(var Message: TWMCopyData);
var
  S: string;
  Strings: TStringList;
  I: Integer;
begin
  with Message do
    if (From = 0) and Assigned(CopyDataStruct) and (CopyDataStruct^.dwData =
AppInstCmdLineDataKind) and
      (CopyDataStruct^.cbData > 0) then
    begin
      Strings := TStringList.Create;
      try
        with CopyDataStruct^ do
          SetString(S, PChar(lpData), cbData);
        Strings.Text := S;
        for I := 0 to Strings.Count - 1 do
          OpenFile(Strings[I]);
      finally
        Strings.Free;
      end;
    end;
end;

OpenFile potom kontroluje, ci pre dane meno suboru uz existuje otvorene MDI
child okno; ak ano, len ho nastavi ho do popredia, inak vytvori nove okno.

HTH
TOndrej


Odpovedá: Jiri Foldyna

6. 10. 2004 18:11

Diky vsem, vyzkousim.

Jiri Foldyna

> procedure TMyAppMainForm.WMCopyData(var Message: TWMCopyData);
> var
> S: string;
> Strings: TStringList;
> I: Integer;
> begin
> with Message do
> if (From = 0) and Assigned(CopyDataStruct) and
> (CopyDataStruct^.dwData =
> AppInstCmdLineDataKind) and
> (CopyDataStruct^.cbData > 0) then
> begin
> Strings := TStringList.Create;
> try
> with CopyDataStruct^ do
> SetString(S, PChar(lpData), cbData);
> Strings.Text := S;
> for I := 0 to Strings.Count - 1 do
> OpenFile(Strings[I]);
> finally
> Strings.Free;
> end;
> end;
> end;
>
> OpenFile potom kontroluje, ci pre dane meno suboru uz
> existuje otvorene MDI
> child okno; ak ano, len ho nastavi ho do popredia, inak
> vytvori nove okno.
>
> HTH
> TOndrej
>
>
>